#include <sys/time.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/select.h>

int main()
{
    int keyboard;
    int ret, i;
    char c;
    fd_set readfd;
    struct timeval timeout;
    // 其中/dev/tty当前终端，任何tty（任何类型的终端设备），O_RDONLY | O_NONBLOCK表示：只读｜非阻塞
    // 非阻塞地读取终端上的输入信息
    keyboard = open("/dev/tty", O_RDONLY | O_NONBLOCK);
    // 如果条件返回错误，则终止程序执行
    assert(keyboard > 0);
    while (1)
    {
        // 超时时间设置为1s
        timeout.tv_sec = 1;
        timeout.tv_usec = 0;
        // 把可读的fd集合都清空
        FD_ZERO(&readfd);
        // 把打开终端的描述符加入到可读描述符集合中
        FD_SET(keyboard, &readfd);
        // 调用select函数查看是否有可读的fd
        ret = select(keyboard + 1, &readfd, NULL, NULL, &timeout);
        // 如果终端的描述符在可读描述符集合中
        if (FD_ISSET(keyboard, &readfd))
        {
            // 开始读取数据
            i = read(keyboard, &c, 1);
            // 如果读到的字符是\n，则继续
            if ('\n' == c)
                continue;
            printf("The input is %c\n", c);
            // 如果读到的字符是q，就退出
            if ('q' == c)
                break;
        }
    }
    return 0;
}
